#include "threadsafequeue.h"

ThreadSafeQueue::ThreadSafeQueue() {}

void ThreadSafeQueue::push(cv::Mat frame)
{
    std::unique_lock<std::mutex> lock(mtx);
    // 队列满时等待空间
    cond.wait(lock, [&]{ return frames.size() < MAX_QUEUE_SIZE; });
    frames.push(std::move(frame));  // 移动语义减少拷贝
    lock.unlock();
    cond.notify_one();  // 通知消费者

    // 作者：程序员打怪兽
    //     链接：https://juejin.cn/post/7515391516786589730
    //                   来源：稀土掘金
    //                   著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
}

cv::Mat ThreadSafeQueue::pop()
{
    std::unique_lock<std::mutex> lock(mtx);
    // 队列空时等待数据
    cond.wait(lock, [&]{ return !frames.empty(); });
    cv::Mat frame = std::move(frames.front());  // 移动语义
    frames.pop();
    lock.unlock();
    cond.notify_one();  // 通知生产者
    return frame;

//     作者：程序员打怪兽
//         链接：https://juejin.cn/post/7515391516786589730
//                       来源：稀土掘金
//                       著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
 }

int ThreadSafeQueue::count()
{
    if(frames.empty()){
        return 0;
    }
    return frames.size();
}

void ThreadSafeQueue::clear()
{
    // std::unique_lock<std::mutex> lock(mtx);
    frames.empty();
    // lock.unlock();
}
